<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h4>构造继承</h4>
  <h5>特点：</h5>
  <ul>
    <li>1、解决了1中，子类实例共享父类引用属性的问题</li>
    <li>2、创建子类实例时，可以向父类传递参数</li>
    <li>3、可以实现多继承（call多个父类对象）</li>
  </ul>

  <h5>缺点：</h5>
  <ul>
    <li>1、实例并不是父类的实例，只是子类的实例</li>
    <li>2、只能继承父类的实例属性和方法，不能继承原型属性/方法</li>
    <li>3、无法实现函数复用，每个子类都有父类实例函数的副本，影响性能(方法都在构造函数中定义，每次创建实例都会创建一遍方法)</li>
  </ul>

  <script>
    // 定义一个动物类
    function Animal(name) {
      // 属性
      this.name = name || 'Animal';
      // 实例方法
      this.sleep = function () {
        console.log(this.name + '正在睡觉！');
      }
    }
    // 原型方法
    Animal.prototype.eat = function (food) {
      console.log(this.name + '正在吃：' + food);
    };



    function Cat(name) {
      Animal.call(this);// 核心：使用父类的构造函数来增强子类实例，等于是复制父类的实例属性给子类实例属性（没用到原型）
      this.name = name || 'Tom';
    }

    var cat = new Cat();
    console.dir(cat)
    console.log(cat.name);
    cat.sleep();
    console.log(cat instanceof Animal); // false
    console.log(cat instanceof Cat); // true

  </script>

</body>

</html>